﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;

namespace Passion3DProject.src.About_the_Camera
{
    class ThirdPersonCamera : Camera
    {
        #region Atributes
        #endregion

        #region Methods
        /// <summary>
        /// Construtor da camera
        /// </summary>
        /// <param name="graphicsDevice">Placa de video</param>
        public ThirdPersonCamera() 
        {
            this.NearestDistance = 1.0f;
            this.MaxDistance = 500.0f;
            this.Target = Vector3.Zero;
            this.Orientation = Vector3.Up;  
            this.CameraGapAngle = 45.0f;
            this.PlayerDistance = new Vector3(0, 10, 15);
            this.TargetDistance = new Vector3(0, 20, 0);
            this.AspectRatio = Game1.AspectRatio;
            
            this.WorldCamMatrix = Matrix.Identity;

            this.viewMatrix = Matrix.CreateLookAt(Position, Target, Orientation);
            
            this.ProjectionCamMatrix = Matrix.CreatePerspectiveFieldOfView(
                CameraGapAngle,
                AspectRatio,
                NearestDistance,
                MaxDistance);
        }
        
        /// <summary>
        /// Update da Camera
        /// </summary>
        /// <param name="RotationAngle">Direção para onde o player está olhando</param>
        /// <param name="playerPosition">Posição do Player</param>
        #region Camera´s Update
        public void Update(float RotationAngle,Vector3 playerPosition)
        {
            //Ajustando a Rotação da Câmera em funcão da direção do player, ou seja, ajusta a câmera para onde o player está olhando
            Matrix cameraRotation = Matrix.CreateRotationY(RotationAngle);
            //Transformação da matriz em um vetor para que a câmera se mova na direção que o player está olhando
            Vector3 CameraRotatedVector = Vector3.Transform(PlayerDistance, cameraRotation);
            //Atualiza a Posição da Câmera
            Position = playerPosition + CameraRotatedVector;
            //Ajusta o target da Câmera. O target olha para o Player + o "ajuste", ou seja, a câmera fica em cima do player
            Target = playerPosition + new Vector3(0,5,2);
            //Atualiza o VIEW da câmera em função da sua posição, target e orientação
            viewMatrix = Matrix.CreateLookAt(Position, Target, Orientation);
            //Atualiza a Projeção da câmera
            ProjectionCamMatrix = Matrix.CreatePerspectiveFieldOfView(
                CameraGapAngle,
                AspectRatio,
                NearestDistance,
                MaxDistance);
        }
        #endregion
        #endregion
    }
}
